﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MIAP.DataAccess.Interfaces;
using MIAP.Entidades;

namespace MIAP.Negocio
{
    /// <summary>
    /// Clase de negocio que encapsula las propiedades para la vista ActualizarVersion.
    /// </summary>
    public class ActualizacionVersionNegocio
    {
        #region Campos

        /// <summary>
        /// Instancia para el acceso a datos de Actualización de Versión Válida.
        /// </summary>
        private readonly IActualizaVersionDao daoActualizacion;

        /// <summary>
        /// Clase para las operaciones de negocio comunes a la aplicación.
        /// </summary>
        private ComunesNegocio comunesNegocio;

        #endregion

        #region Constructor

        /// <summary>
        /// Inicializa una instancia de <see cref="ActualizacionVersionNegocio"/>
        /// </summary>
        public ActualizacionVersionNegocio()
        {
            this.daoActualizacion = DataAccessFactory.Instance.CreateActualizacionVersionDao();
            this.comunesNegocio = new ComunesNegocio();
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Obtiene todos los archivos activos versionables que coincidan con los filtros.
        /// </summary>
        /// <param name="actualizacionVersionFilters">Contien los filtros que serán aplicados en la búsqueda.</param>
        /// <returns>Lista de archivos versionables</returns>
        public IList<ActualizacionVersionInfo> GetArchivosVersionables(ActualizacionVersionInfo actualizacionVersionFilters)
        {
            List<ActualizacionVersionInfo> listArchivosVersionables;

            // Obtener los archivos versionables.
            listArchivosVersionables = this.daoActualizacion.GetArchivosVersionables(actualizacionVersionFilters).ToList();

            // Obtener los archivos versionable con el último proceso por cada versión.
            List<ActualizacionVersionInfo> listArchivosVersionablesLastProcess = ComunesNegocio.GetArchivoWithLastProcess(listArchivosVersionables);
            
            List<CatalogoInfo> listArchivos = new List<CatalogoInfo>();            

            foreach (ActualizacionVersionInfo archivo in listArchivosVersionablesLastProcess)
            {
                listArchivos.Add(new CatalogoInfo { IdItem = archivo.IdCargaArchivo, Descripcion = archivo.Version });             
            }

            if (listArchivos.Count != default(int))
            {
                // Obtener los autorizadores.
                List<EjecutorInfo> listAutorizadores = this.daoActualizacion.GetAutorizador(listArchivos).ToList();

                foreach (EjecutorInfo autorizador in listAutorizadores)
                {
                    listArchivosVersionablesLastProcess.Where(p => p.IdCargaArchivo == autorizador.IdCargaArchivo && p.Version == autorizador.VersionArchivo).Single().Autorizador = autorizador.NombreEjecutor;                   
                }

                // Obtener los versionadores.
                List<CatalogoInfo> listVersionadores = this.daoActualizacion.GetNombreVersionador(listArchivos).ToList();

                foreach (CatalogoInfo versionador in listVersionadores)
                {
                    listArchivosVersionablesLastProcess.Where(p => p.IdCargaArchivo == versionador.IdItem).Single().NombreEjecutorCarga = versionador.Descripcion;
                }
            }

            return listArchivosVersionablesLastProcess;
        }      

        /// <summary>
        /// Modifica la versión válida de un archivo.
        /// </summary>
        /// <param name="actualizacionVersion">Archivo que será modificado.</param>
        /// <param name="user">Usuario que ehecuta la operación.</param>
        public void EditVersionValida(ActualizacionVersionInfo actualizacionVersion, string user)
        {
            this.daoActualizacion.EditVersionValida(actualizacionVersion, user);
        }

        #endregion
    }
}
